package br.org.bertol.mestrado.engine.optimisation.pso;

import java.util.Collections;

import br.org.bertol.mestrado.engine.optimisation.Operacao;
import br.org.bertol.mestrado.engine.optimisation.entity.Particle;

/**
 * Tipos de movimentos do PSO. Apenas 1.
 * @author contaqualquer
 */
public enum TypeMovement implements Operacao<Particle<?>> {

    /**
     * Mocimento de Clerc.
     */
    CLERC {
        @Override
        public void execute(final Particle<?> particle) {

            for (Velocity<?> velocity : particle.getSpeed()) {

                // usando versão do algoritmo de clerc para trocar indices

                // pega os índices dos elementos
                final int indexClasse1 = particle.getRoute()
                        .indexOf(
                                 velocity.getPar1());

                final int indexClasse2 = particle.getRoute()
                        .indexOf(
                                 velocity.getPar2());

                // troca os elementos
                Collections.swap(particle.getRoute(), indexClasse1,
                                 indexClasse2);
            }
        }
    };
}
